package util.converter;

import java.sql.Time;
import java.util.Calendar;
import java.util.GregorianCalendar;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;
import javax.faces.convert.FacesConverter;
import util.enumeration.Language;
import util.enumeration.Time24H;
import util.enumhelper.SupportedLocale;
import util.localization.WebLocalization;


/**
 *
 * @author Amelia
 */
@FacesConverter(value = "time24HConverter", forClass = util.enumeration.Time24H.class)
public class Time24HConverter implements Converter {
    
    private WebLocalization localization;
    private String preferredLocale;
    
    
    public Time24HConverter() {
        /* LOCALIZATION */
        localization = new WebLocalization();
        /* END LOCALIZATION */
    }
    
    @Override
    public Object getAsObject(FacesContext context, UIComponent component, String value) {    

        preferredLocale = localization.getPreferredLocaleFromSession();
        
        if (value == null || value.length() == 0) {
            return null;
        }
         
        // en_US ENGLISH, UNITED STATES
        if (preferredLocale.equals(SupportedLocale.getSupportedLocaleStringByLanguage(Language.ENGLISH_US))) {
            return getTime24HAsObject(value);
        }
        // en_SG ENGLISH, SINGAPORE
        else
        if (preferredLocale.equals(SupportedLocale.getSupportedLocaleStringByLanguage(Language.ENGLISH_SINGAPORE))) {
            return getTime24HAsObject(value);
        }
        // ms_MY MALAY, MALAYSIA
        else
        if (preferredLocale.equals(SupportedLocale.getSupportedLocaleStringByLanguage(Language.MALAY))) {
            return getTime24HAsObject(value);
        }

        // zh_CN CHINESE, CHINA
        else
        if (preferredLocale.equals(SupportedLocale.getSupportedLocaleStringByLanguage(Language.CHINESE_CHINA))) {
            return getTime24HAsObject(value);
        }
        // other language...
        else {
            return getTime24HAsObject(value);
        }
    }
    
    @Override
    public String getAsString(FacesContext context, UIComponent component, Object value) {
        
        preferredLocale = localization.getPreferredLocaleFromSession();
        
        if (value instanceof Time24H) {
          Time24H time24H = (Time24H) value;
        
        String localizedTime24H = "";
        
        // en_US ENGLISH, UNITED STATES
        if (preferredLocale.equals(SupportedLocale.getSupportedLocaleStringByLanguage(Language.ENGLISH_US))) {
            localizedTime24H = getTime24H(time24H);
        }
        // en_SG ENGLISH, SINGAPORE
        else if (preferredLocale.equals(SupportedLocale.getSupportedLocaleStringByLanguage(Language.ENGLISH_SINGAPORE))) {
            localizedTime24H = getTime24H(time24H);
        }
        // ms_MY MALAY, MALAYSIA
        else if (preferredLocale.equals(SupportedLocale.getSupportedLocaleStringByLanguage(Language.MALAY))) {
            localizedTime24H = getTime24H(time24H);
        }
        
        // zh_CN CHINESE, CHINA
        else if (preferredLocale.equals(SupportedLocale.getSupportedLocaleStringByLanguage(Language.CHINESE_CHINA))) {
            localizedTime24H = getTime24H(time24H);
        }
        // other language...
        else {
            localizedTime24H = getTime24H(time24H);
        }
         return localizedTime24H;
        }
        else {
            throw new IllegalArgumentException("object " + value + " is of type " + value.getClass().getName() + "; expected type: util.enumeration.Time24H");
        }
    }
    
//    public Time getAsTime(FacesContext context, UIComponent component, Object value) {
//        
//        preferredLocale = localization.getPreferredLocaleFromSession();
//        
//        if (value instanceof Time24H) {
//          Time24H time24H = (Time24H) value;
//        
//        Time localizedTime24H = null;
//        
//        // en_US ENGLISH, UNITED STATES
//        if (preferredLocale.equals(SupportedLocale.getSupportedLocaleStringByLanguage(Language.ENGLISH_US))) {
//            localizedTime24H = getTime24HAsTime(time24H);
//        }
//        // en_SG ENGLISH, SINGAPORE
//        else if (preferredLocale.equals(SupportedLocale.getSupportedLocaleStringByLanguage(Language.ENGLISH_SINGAPORE))) {
//            localizedTime24H = getTime24HAsTime(time24H);
//        }
//        // ms_MY MALAY, MALAYSIA
//        else if (preferredLocale.equals(SupportedLocale.getSupportedLocaleStringByLanguage(Language.MALAY))) {
//            localizedTime24H = getTime24HAsTime(time24H);
//        }
//        
//        // zh_CN CHINESE, CHINA
//        else if (preferredLocale.equals(SupportedLocale.getSupportedLocaleStringByLanguage(Language.CHINESE_CHINA))) {
//            localizedTime24H = getTime24HAsTime(time24H);
//        }
//        // other language...
//        else {
//            localizedTime24H = getTime24HAsTime(time24H);
//        }
//         return localizedTime24H;
//        }
//        else {
//            throw new IllegalArgumentException("object " + value + " is of type " + value.getClass().getName() + "; expected type: util.enumeration.Time24H");
//        }
//    }
    
    // simplified chinese (zh_CN)
    private static Object getTime24HAsObject(String value) {
        Object localizedTime24H = "";
        
//        if (value.equals("00:00")) return convertStringToTime(Time24H.ZERO);
//        else if (value.equals("01:00")) return convertStringToTime(Time24H.ONE);
//        else if (value.equals("02:00")) return convertStringToTime(Time24H.TWO);
//        else if (value.equals("03:00")) return convertStringToTime(Time24H.THREE);
//        else if (value.equals("04:00")) return convertStringToTime(Time24H.FOUR);
//        else if (value.equals("05:00")) return convertStringToTime(Time24H.FIVE);
//        else if (value.equals("06:00")) return convertStringToTime(Time24H.SIX);
//        else if (value.equals("07:00")) return convertStringToTime(Time24H.SEVEN);
//        else if (value.equals("08:00")) return convertStringToTime(Time24H.EIGHT);
//        else if (value.equals("09:00")) return convertStringToTime(Time24H.NINE);
//        else if (value.equals("10:00")) return convertStringToTime(Time24H.TEN);
//        else if (value.equals("11:00")) return convertStringToTime(Time24H.ELEVEN);
//        else if (value.equals("12:00")) return convertStringToTime(Time24H.TWELVE);
//        else if (value.equals("13:00")) return convertStringToTime(Time24H.THIRTEEN);
//        else if (value.equals("14:00")) return convertStringToTime(Time24H.FOURTEEN);
//        else if (value.equals("15:00")) return convertStringToTime(Time24H.FIFTEEN);
//        else if (value.equals("16:00")) return convertStringToTime(Time24H.SIXTEEN);
//        else if (value.equals("17:00")) return convertStringToTime(Time24H.SEVENTEEN);
//        else if (value.equals("18:00")) return convertStringToTime(Time24H.EIGHTEEN);
//        else if (value.equals("19:00")) return convertStringToTime(Time24H.NINETEEN);
//        else if (value.equals("20:00")) return convertStringToTime(Time24H.TWENTY);
//        else if (value.equals("21:00")) return convertStringToTime(Time24H.TWENTY_ONE);
//        else if (value.equals("22:00")) return convertStringToTime(Time24H.TWENTY_TWO);
//        else if (value.equals("23:00")) return convertStringToTime(Time24H.TWENTY_THREE);
        
        if (value.equals("00:00")) return Time24H.ZERO;
        else if (value.equals("01:00")) return Time24H.ONE;
        else if (value.equals("02:00")) return Time24H.TWO;
        else if (value.equals("03:00")) return Time24H.THREE;
        else if (value.equals("04:00")) return Time24H.FOUR;
        else if (value.equals("05:00")) return Time24H.FIVE;
        else if (value.equals("06:00")) return Time24H.SIX;
        else if (value.equals("07:00")) return Time24H.SEVEN;
        else if (value.equals("08:00")) return Time24H.EIGHT;
        else if (value.equals("09:00")) return Time24H.NINE;
        else if (value.equals("10:00")) return Time24H.TEN;
        else if (value.equals("11:00")) return Time24H.ELEVEN;
        else if (value.equals("12:00")) return Time24H.TWELVE;
        else if (value.equals("13:00")) return Time24H.THIRTEEN;
        else if (value.equals("14:00")) return Time24H.FOURTEEN;
        else if (value.equals("15:00")) return Time24H.FIFTEEN;
        else if (value.equals("16:00")) return Time24H.SIXTEEN;
        else if (value.equals("17:00")) return Time24H.SEVENTEEN;
        else if (value.equals("18:00")) return Time24H.EIGHTEEN;
        else if (value.equals("19:00")) return Time24H.NINETEEN;
        else if (value.equals("20:00")) return Time24H.TWENTY;
        else if (value.equals("21:00")) return Time24H.TWENTY_ONE;
        else if (value.equals("22:00")) return Time24H.TWENTY_TWO;
        else if (value.equals("23:00")) return Time24H.TWENTY_THREE;
        
//        switch (value) {
//            case 0: localizedTime24H = Time24H.ZERO ; break;
//            case 1: localizedTime24H = Time24H.ONE; break;
//            case 2: localizedTime24H = Time24H.TWO; break;
//            case 3: localizedTime24H = Time24H.THREE; break;
//            case 4: localizedTime24H = Time24H.FOUR; break;
//            case 5: localizedTime24H = Time24H.FIVE; break;
//            case 6: localizedTime24H = Time24H.SIX; break;
//            case 7: localizedTime24H = Time24H.SEVEN; break;
//            case 8: localizedTime24H = Time24H.EIGHT; break;
//            case 9: localizedTime24H = Time24H.NINE; break;
//            case 10: localizedTime24H = Time24H.TEN; break;
//            case 11: localizedTime24H = Time24H.ELEVEN; break;
//            case 12: localizedTime24H = Time24H.TWELVE; break;
//            case 13: localizedTime24H = Time24H.THIRTEEN; break;
//            case 14: localizedTime24H = Time24H.FOURTEEN; break;
//            case 15: localizedTime24H = Time24H.FIFTEEN; break;
//            case 16: localizedTime24H = Time24H.SIXTEEN; break;
//            case 17: localizedTime24H = Time24H.SEVENTEEN; break;
//            case 18: localizedTime24H = Time24H.EIGHTEEN; break;
//            case 19: localizedTime24H = Time24H.NINETEEN; break;
//            case 20: localizedTime24H = Time24H.TWENTY; break;
//            case 21: localizedTime24H = Time24H.TWENTY_ONE; break;
//            case 22: localizedTime24H = Time24H.TWENTY_TWO; break;
//            case 23: localizedTime24H = Time24H.TWENTY_THREE; break;
//         }
        return localizedTime24H;
    }
    
    
    

    // simplified chinese (zh_CN)
    private static String getTime24H(Time24H time24H) {
        String localizedTime24H = "";
        
        switch (time24H) {
            case ZERO: localizedTime24H = "00:00" ; break;
            case ONE: localizedTime24H = "01:00"; break;
            case TWO: localizedTime24H = "02:00"; break;
            case THREE: localizedTime24H = "03:00"; break;
            case FOUR: localizedTime24H = "04:00"; break;
            case FIVE: localizedTime24H = "05:00"; break;
            case SIX: localizedTime24H = "06:00"; break;
            case SEVEN: localizedTime24H = "07:00"; break;
            case EIGHT: localizedTime24H = "08:00"; break;
            case NINE: localizedTime24H = "09:00"; break;
            case TEN: localizedTime24H = "10:00"; break;
            case ELEVEN: localizedTime24H = "11:00"; break;
            case TWELVE: localizedTime24H = "12:00"; break;
            case THIRTEEN: localizedTime24H = "13:00"; break;
            case FOURTEEN: localizedTime24H = "14:00"; break;
            case FIFTEEN: localizedTime24H = "15:00"; break;
            case SIXTEEN: localizedTime24H = "16:00"; break;
            case SEVENTEEN: localizedTime24H = "17:00"; break;
            case EIGHTEEN: localizedTime24H = "18:00"; break;
            case NINETEEN: localizedTime24H = "19:00"; break;
            case TWENTY: localizedTime24H = "20:00"; break;
            case TWENTY_ONE: localizedTime24H = "21:00"; break;
            case TWENTY_TWO: localizedTime24H = "22:00"; break;
            case TWENTY_THREE: localizedTime24H = "23:00"; break;
         }
        return localizedTime24H;
    }
    
    
    
    
//    // simplified chinese (zh_CN)
//    private static Time getTime24HAsTime(Time24H time24H) {
//        Time localizedTime24H = null;
//        
//        System.out.println("ENTERED TIME");
//        
//        localizedTime24H = convertCalendarToTime(time24H.getTime());
//        
////        switch (time24H) {
////            case ZERO: localizedTime24H = convertCalendarToTime(time24H.getTime()); break;
////            case ONE: localizedTime24H = convertCalendarToTime(time24H.getTime()); break;
////            case TWO: localizedTime24H = convertCalendarToTime(time24H.getTime()); break;
////            case THREE: localizedTime24H = convertCalendarToTime(time24H.getTime()); break;
////            case FOUR: localizedTime24H = convertCalendarToTime(time24H.getTime()); break;
////            case FIVE: localizedTime24H = convertCalendarToTime(time24H.getTime()); break;
////            case SIX: localizedTime24H = "06:00:00"; break;
////            case SEVEN: localizedTime24H = "07:00:00"; break;
////            case EIGHT: localizedTime24H = "08:00:00"; break;
////            case NINE: localizedTime24H = "09:00:00"; break;
////            case TEN: localizedTime24H = "10:00:00"; break;
////            case ELEVEN: localizedTime24H = "11:00:00"; break;
////            case TWELVE: localizedTime24H = "12:00:00"; break;
////            case THIRTEEN: localizedTime24H = "13:00:00"; break;
////            case FOURTEEN: localizedTime24H = "14:00:00"; break;
////            case FIFTEEN: localizedTime24H = "15:00:00"; break;
////            case SIXTEEN: localizedTime24H = "16:00:00"; break;
////            case SEVENTEEN: localizedTime24H = "17:00:00"; break;
////            case EIGHTEEN: localizedTime24H = "18:00:00"; break;
////            case NINETEEN: localizedTime24H = "19:00:00"; break;
////            case TWENTY: localizedTime24H = "20:00:00"; break;
////            case TWENTY_ONE: localizedTime24H = "21:00:00"; break;
////            case TWENTY_TWO: localizedTime24H = "22:00:00"; break;
////            case TWENTY_THREE: localizedTime24H = "23:00:00"; break;
////         }
//        return localizedTime24H;
//    }
    
    private static Time convertCalendarToTime(int hourOfDay) {
        Calendar cal = new GregorianCalendar();
        cal.set(Calendar.DAY_OF_MONTH, 0);
        cal.set(Calendar.MONTH, 0);
        cal.set(Calendar.YEAR, 0);
        cal.set(Calendar.HOUR_OF_DAY, hourOfDay);
        Time t = new Time(cal.getTimeInMillis());
        return t;
    }
    
    private static Time convertStringToTime(Time24H time24H) {
        Calendar cal = new GregorianCalendar();
        cal.set(Calendar.DAY_OF_MONTH, 0);
        cal.set(Calendar.MONTH, 0);
        cal.set(Calendar.YEAR, 0);
        cal.set(Calendar.HOUR_OF_DAY, time24H.getTime());
        Time t = new Time(cal.getTimeInMillis());
        return t;
    }
    
   
}